# 准备合并逻辑。。两个数据库字段统一

import datetime
import json
import mysql.connector

from demoPython.config.BaseConfig import db_config
from tanxi.client.Handler.DataBase import DatabaseHandler
# 工具
from tanxi.client.Handler.Logger import log_info


# 功能类1 文章查询  
class ArticleQueryHandler():
    def __init__(self):
        self.db_handler = DatabaseHandler(**db_config)
    
    def get_data_from_database(self,table, joins=None, where_clause=None):
        """
        从数据库中获取指定表的数据，支持外键关联查询。

        :param table: 主表名
        :param joins: 关联表信息，格式为 [{"table": 关联表名, "on": 关联条件}]
        :param where_clause: 可选的 WHERE 条件（例如 "id = 1"）
        :return: JSON 格式的查询结果
        """
        # 连接数据库
        db_handler = self.db_handler.connect()

        query = f"SELECT * FROM {table}"
        if joins:
            for join in joins:
                query += f" JOIN {join['table']} ON {join['on']}"
        if where_clause:
            query += f" WHERE {where_clause}"
        
        if table == 'articles':
            results = db_handler.execute_query(query)
        else:
            results = db_handler.query_to_json(query)
        log_info(f"查询结果: {results}")
        # 关闭数据库连接
        db_handler.close()    
        
        return results
    


# 功能类2 文章写入更新处理
class ArticleUpdateHandler():
    def __init__(self):
        self.db_handler = DatabaseHandler(**db_config)

    def insert_or_update_article(self,db_handler, article_data):
        """
        插入或更新文章数据到数据库。

        :param db_handler: 数据库处理器实例
        :param article_data: 文章数据（字典格式）
        :return: 操作是否成功
        """

        if "tags" in article_data and isinstance(article_data["tags"], list):
            article_data["tags"] = json.dumps(article_data["tags"], ensure_ascii=False)
            
        # 获取或创建作者 ID
        if "author_id" in article_data:
            # 如果直接提供了 author_id，直接使用
            author_id = article_data["author_id"]
        elif "author" in article_data:
            # 如果提供了作者信息，获取或创建作者
            author_id = self.get_or_create_author(db_handler, article_data["author"])
        else:
            raise ValueError("文章数据中缺少 'author' 或 'author_id' 字段")

        # 如果 tags 是一个列表，先将其转换为 JSON 字符串

        # 日期字段处理，确保格式为 YYYY-MM-DD
        article_date = datetime.strptime(article_data["date"], "%Y-%m-%d").date()
        # 检查文章是否存在
        query = "SELECT id FROM articles WHERE id = %s"
        existing_article = db_handler.execute_query(query, (article_data["id"],))


        if existing_article:
            # 文章已存在，执行更新操作
            set_clause = ", ".join([f"{key} = %s" for key in article_data.keys() if key != "author" and key != "tags"])
            query = f"UPDATE articles SET {set_clause}, tags = %s WHERE id = %s"
            params = tuple(article_data[key] for key in article_data if key != "author" and key != "tags") + (article_data["tags"], article_data["id"])
            operation = "更新"
        else:
            # 文章不存在，执行插入操作
            columns = ", ".join([key for key in article_data.keys() if key != "author"])
            values = ", ".join(["%s"] * len(article_data))
            query = f"INSERT INTO articles ({columns}, tags) VALUES ({values}, %s)"
            params = tuple(article_data[key] for key in article_data if key != "author") + (article_data["tags"],)
            operation = "插入"

        # 执行 SQL 操作
        # print(params)
        try:
            db_handler.execute_query(query, params)
            print(f"文章{operation}成功！")
            return True
        except mysql.connector.Error as err:
            print(f"文章{operation}失败: {err}")
            return False

    def get_or_create_author(self,db_handler, author_data):
        """
        检查作者是否存在，如果不存在则插入新作者并返回作者 ID。

        :param db_handler: 数据库处理器实例
        :param author_data: 作者数据（字典格式）
        :return: 作者 ID
        """
        if "name" not in author_data:
            raise ValueError("作者数据中缺少 'name' 字段")

        # 检查作者是否存在
        query = "SELECT id FROM authors WHERE name = %s"
        existing_author = db_handler.execute_query(query, (author_data["name"],))

        if existing_author:
            # 作者已存在，返回作者 ID
            return existing_author[0]["id"]
        else:
            # 作者不存在，插入新作者
            columns = ", ".join(author_data.keys())
            values = ", ".join(["%s"] * len(author_data))
            query = f"INSERT INTO authors ({columns}) VALUES ({values})"
            params = tuple(author_data.values())
            db_handler.execute_query(query, params)
            return db_handler.cursor.lastrowid  # 返回新插入的作者 ID


    def update_database(self,article_data):
        '''
        更新数据库 主要逻辑
        '''
        # 连接数据库
        db_handler = self.db_handler.connect()
        # 调用插入或更新文章方法
        self.insert_or_update_article(db_handler, article_data)
        # 关闭数据库连接
        db_handler.close()

        return True

